package org.gwt.client.vista;

import org.gwt.client.controlador.BotonListener;
import org.gwt.client.controlador.CanvasListener;
import org.vaadin.gwtgraphics.client.DrawingArea;

import com.extjs.gxt.ui.client.Style;
import com.extjs.gxt.ui.client.Style.LayoutRegion;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.ComponentEvent;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.event.WidgetListener;
import com.extjs.gxt.ui.client.util.Margins;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.LayoutContainer;
import com.extjs.gxt.ui.client.widget.Text;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.FieldSet;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.BorderLayout;
import com.extjs.gxt.ui.client.widget.layout.BorderLayoutData;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.RowData;
import com.extjs.gxt.ui.client.widget.layout.RowLayout;
import com.extjs.gxt.ui.client.widget.layout.TableData;
import com.extjs.gxt.ui.client.widget.layout.TableLayout;
import com.extjs.gxt.ui.client.widget.layout.VBoxLayout;
import com.extjs.gxt.ui.client.widget.layout.VBoxLayoutData;
import com.extjs.gxt.ui.client.widget.layout.VBoxLayout.VBoxLayoutAlign;

public class PanelDibujo extends ContentPanel {

	private DrawingArea canvas;
	private FieldSet fieldSetProblema, fieldSetEcuaciones;;
	private Text textTextoProblema;
	private Canvas dibuja;
	private Button botonOk;
	private BotonListener botonListenerOk;
	private FormPanel formPanelEcuacion;
	private LayoutContainer layoutContainerProblemas;
	private TextField<String> textFieldEcuacion;
	private CanvasListener canvasListener;
	private FieldSet fieldSetDibujo;

	public PanelDibujo() {
		setHeading("Problema");
		setFrame(true);
		setSize(700, 350);
		setLayout(new BorderLayout());

		BorderLayoutData borderLayoutDataProblema = new BorderLayoutData(
				LayoutRegion.CENTER, 200.0f);
		borderLayoutDataProblema.setMargins(new Margins(0, 5, 0, 0));

		add(getEcuaciones(), new BorderLayoutData(LayoutRegion.EAST, 295.0f));
		add(getProblema(), borderLayoutDataProblema);

		inicializarBotonOk();
	}

	public LayoutContainer getProblema() {
		layoutContainerProblemas = new LayoutContainer();
		VBoxLayout vBoxLayoutProblemas = new VBoxLayout();
		vBoxLayoutProblemas.setVBoxLayoutAlign(VBoxLayoutAlign.STRETCH);
		layoutContainerProblemas.setLayout(vBoxLayoutProblemas);

		// Texto problema
		RowLayout rowLayoutProblema = new RowLayout();
		rowLayoutProblema.setExtraStyle("fondoBlanco");
		fieldSetProblema = new FieldSet();
		fieldSetProblema.setHeading("Problema");
		fieldSetProblema.setLayout(rowLayoutProblema);

		textTextoProblema = new Text("");
		textTextoProblema.setStyleName("textoProblema");
		textTextoProblema.setBorders(true);
		fieldSetProblema.add(textTextoProblema, new RowData(Style.DEFAULT,
				85.0, new Margins()));

		layoutContainerProblemas.add(fieldSetProblema);

		// Panel Dibujo
		fieldSetDibujo = new FieldSet();

		RowLayout rowLayoutDibujo = new RowLayout();
		fieldSetDibujo.setHeading("Dibujo");
		fieldSetDibujo.setLayout(rowLayoutDibujo);

		canvas = new DrawingArea(400, 400);
		fieldSetDibujo.add(canvas);

		fieldSetDibujo.addWidgetListener(new WidgetListener() {
			public void widgetResized(ComponentEvent ce) {
				canvas.setHeight(fieldSetDibujo.getHeight());
				canvas.setWidth(fieldSetDibujo.getWidth());
				// Window.alert(canvas.getWidth()+","+canvas.getHeight());
			}
		});
		canvas.setStyleName("fondoBlanco");
		dibuja = new Canvas();
		dibuja.setCanvas(canvas);
		dibuja.dibujarEjes(true);

		VBoxLayoutData vbld_fieldSetDibujo = new VBoxLayoutData();
		vbld_fieldSetDibujo.setFlex(1.0);
		layoutContainerProblemas.add(fieldSetDibujo, vbld_fieldSetDibujo);
		return layoutContainerProblemas;
	}

	public FieldSet getEcuaciones() {
		fieldSetEcuaciones = new FieldSet();
		fieldSetEcuaciones.setHeading("Definición");
		fieldSetEcuaciones.setLayout(new FitLayout());

		formPanelEcuacion = new FormPanel();
		formPanelEcuacion.setPadding(5);
		formPanelEcuacion.setBodyBorder(false);
		formPanelEcuacion.setHeaderVisible(false);
		formPanelEcuacion.setLayout(new TableLayout(3));
		// formPanelPunto.setLayout();

		Text txtEcuacin = new Text("Ecuación");
		TableData td_txtEcuacin = new TableData();
		td_txtEcuacin.setPadding(2);
		formPanelEcuacion.add(txtEcuacin, td_txtEcuacin);
		txtEcuacin.setWidth("48");

		textFieldEcuacion = new TextField<String>();
		textFieldEcuacion.setName("X:");
		TableData tableDataEcuacion = new TableData();
		tableDataEcuacion.setPadding(2);
		formPanelEcuacion.add(textFieldEcuacion, tableDataEcuacion);
		textFieldEcuacion.setWidth("155");

		botonOk = new Button("Ok");
		botonOk.setWidth("50");
		TableData td_btnOk = new TableData();
		td_btnOk.setPadding(2);
		formPanelEcuacion.add(botonOk, td_btnOk);

		fieldSetEcuaciones.add(formPanelEcuacion);
		formPanelEcuacion.setWidth("324px");

		return fieldSetEcuaciones;
	}

	public FieldSet getTituloProblema() {
		return fieldSetProblema;
	}

	public Text getTextoProblema() {
		return textTextoProblema;
	}

	public Canvas getDibuja() {
		return dibuja;
	}

	public Button getBotonOk() {
		return botonOk;
	}

	public FormPanel getFormPanelEcuacion() {
		return formPanelEcuacion;
	}

	public TextField<String> getTextFieldEcuacion() {
		return textFieldEcuacion;
	}

	public void agregaEcuacion(String eq) {
		Text txtEcuacin = new Text(eq);
		TableData td_txtEcuacin = new TableData();
		td_txtEcuacin.setPadding(2);
		td_txtEcuacin.setColspan(3);
		formPanelEcuacion.add(txtEcuacin, td_txtEcuacin);
		txtEcuacin.setWidth("48");

		doLayout();
	}

	private void inicializarBotonOk() {
		botonOk.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				botonListenerOk.botonOk();
			}
		});
	}

	public void escalar() {
		fieldSetDibujo.addWidgetListener(new WidgetListener() {
			public void widgetResized(ComponentEvent ce) {
				canvasListener.escalarCanvas();
			}
		});
	}

	public void addCanvasListener(CanvasListener listener) {
		canvasListener = listener;
	}

	public void addBotonListener(BotonListener listener) {
		botonListenerOk = (listener);
	}

	public void removeBotonListener(BotonListener listener) {
		botonListenerOk = null;
	}
}
